| H:\SEAMCAT\STG_30 Sept 2011 CPH\contribution to STG30 rev3\LocationProbability_rev1.java |
import java.awt.Color;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import org.seamcat.model.plugin.*;
@literal
<p>
<strong></strong>
</br>
</br>
</p>
<p>
<i>
</i> <a href
* ="http://www.cs.princeton.edu/introcs/15inout">
</a>
</p>
@author <a href= "mailto: adhoc@heiseka.de">@heiseka</a>
@version
public class LocationProbability_rev1
implements PostProcessingPlugin, ConsistencyCheck {
private PluginDistribution defaultDistribution;
private String filename = "";
private String defaultPath = "";
private String pathToSave;
private boolean shouldBeSaved = false;
private Vector<String> outputFormat = null;
private Vector<String> outputFigure = null;
private Vector<String> criterion = null;
private int outputFormatIndex = 1;
private int outputFigureIndex = 3;
private int criterionIndex = 1;
private int currentEvent;
private int totalEvents;
private double[] oneShot;
private String header;
private int countVector;
private double maxDistance = 0;
private Transceiver rWt;
private CollectedData singleResult = new CollectedData();
private Vector<CollectedData> simulatedResults = null;
private boolean multipleLinks = false;
private double rCoverN = 20;
private double rCoverI = 20;
private double rIoverN = 0;
private double simulationRadius = 6.7;
private double locationProbability = 95.0;
private Vector<Double> rLP;
private double minDRSS = -86.15;
private double STDDEV = 5.5;
private double stddevInterferer = 0;
private DecimalFormat df = new DecimalFormat();
private Color notAffected;
private String sNotAffected = "100,100,100";
private boolean sholdShowCalculatedResults = true;
private boolean useEBU;
private int numberOfPixelsBelowLP;
private int numberOfPixelsInterfered;
private int numberOfEventsToBeConsidered;
public void init(ParameterFactory param) {
defaultDistribution = param.createDistribution(
PluginDistribution.DistributionType.PolarDistance, 0, 1);
defaultDistribution.trial();
outputFormat = new Vector<String>();
outputFormat.add(".txt");
outputFormat.add(".xml");
outputFormat.add("");
outputFigure = new Vector<String>();
outputFigure.add("dRSS ");
outputFigure.add("C/I ");
outputFigure.add("C/(N+I)");
outputFigure.add("Location Probability (EBU)");
outputFigure.add("dRSS Location Probability");
outputFigure.add("Pixel distribution");
outputFigure.add("none");
criterion = new Vector<String>();
criterion.add("C/I");
criterion.add("C/(I + N)");
criterion.add("I/N");
}
public void cleanUp() {
}
public String getDescription() {
return "This plug-in is to collect data in terms of positions and levels";
}
public void process(ScenarioInfo scenario) throws Exception {
currentEvent = scenario.getCurrentEventNumber();
if (currentEvent <= scenario.getNumberOfInterferingLinks()) {
initPlugin(scenario);
} else if (currentEvent == totalEvents) {
setNumberOfPixelsBelowLP(scenario);
setNumberOfPixelsInterfered(scenario);
calculateLocationProbability(scenario);
if (shouldBeSaved)
storeResults(scenario);
try {
showResults(scenario);
} catch (Exception e) {
e.printStackTrace();
}
} else if (currentEvent > scenario.getNumberOfInterferingLinks()) {
readPosition(scenario);
readDRSS(scenario);
readIRSS(scenario);
}
}
@param
private void initPlugin(ScenarioInfo scenario) {
totalEvents = scenario.getTotalNumberOfEvents();
setNumberOfEventsToBeConsidered(scenario);
initWorkspace(scenario);
if (outputFigureIndex == 3) {
setUseEBU(true);
} else {
setUseEBU(false);
}
df = (DecimalFormat) DecimalFormat.getInstance(Locale.US);
df.applyPattern("###.0#");
simulatedResults = new Vector<CollectedData>();
notAffected = getColorNotAffected(sNotAffected);
countVector = 0;
header = "event;x;y;dRSS;iRSS;noiseFloor;multiple;ilk;CoverN";
maxDistance = 0;
if (outputFormatIndex == 0 && filename.indexOf(".") == -1)
filename += ".txt";
else if (outputFormatIndex == 1 && filename.indexOf(".") == -1)
filename += ".xml";
if (filename.indexOf(".") == -1) {
outputFormatIndex = 1;
filename += ".xml";
}
}
@literal
private boolean checkFilenameAndPath() {
if (filename.equals("") || defaultPath.equals("")) {
return false;
} else {
return true;
}
}
@param
private void initWorkspace(ScenarioInfo scenario) {
rWt = scenario.getVictimLink().getTransmitter();
double radius = scenario.getVictimLink().getReceiver()
.getDistanceTo(rWt);
if (radius > maxDistance)
maxDistance = radius;
rCoverN = scenario.getVictimLink().getReceiver().getRequiredCNIRatio();
rCoverI = scenario.getVictimLink().getReceiver().getRequiredCIRatio();
rIoverN = scenario.getVictimLink().getReceiver().getRequiredINRatio();
}
@param
private void storeResults(ScenarioInfo scenario) {
String part = filename.substring(filename.indexOf(".") + 1);
if (part.equals("txt"))
saveResults(scenario);
else if (part.equals("xml"))
saveResultsXML(scenario);
else {
}
}
@param
@throws
private void showResults(ScenarioInfo scenario) throws Exception {
switch (outputFigureIndex) {
case 0: {
setUseEBU(false);
drawDRSS_Colored(scenario);
break;
}
case 1: {
setUseEBU(false);
drawCoverIColored(scenario);
break;
}
case 2: {
setUseEBU(false);
drawCoverNplusI_Colored(scenario);
break;
}
case 3: {
setUseEBU(true);
drawLocationProbability(scenario);
break;
}
case 4: {
setUseEBU(false);
drawLocationProbability(scenario);
break;
}
case 5: {
setUseEBU(false);
drawPixelsAffected(scenario);
break;
}
default: {
setUseEBU(false);
}
}
if (sholdShowCalculatedResults) {
if (rLP.size() == 0)
calculateLocationProbability(scenario);
try {
showSimulatedResults(scenario);
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void setUseEBU(boolean useEBU) {
this.useEBU = useEBU;
}
public int getNumberOfParameters() {
return 12;
}
public ParameterType getParameterType(int id) {
switch (id) {
case 1: {
return ParameterType.String;
}
case 2: {
return ParameterType.String;
}
case 3: {
return ParameterType.Integer;
}
case 4: {
return ParameterType.Boolean;
}
case 5: {
return ParameterType.Integer;
}
case 6: {
return ParameterType.Double;
}
case 7: {
return ParameterType.Double;
}
case 8: {
return ParameterType.Double;
}
case 9: {
return ParameterType.Double;
}
case 10: {
return ParameterType.Double;
}
case 11: {
return ParameterType.Integer;
}
case 12: {
return ParameterType.Boolean;
}
default: {
throw new IllegalArgumentException("illegal parameter id");
}
}
}
public void setParameterValue(int id, Object value) {
try {
switch (id) {
case 1: {
this.filename = (String) value;
break;
}
case 2: {
this.defaultPath = (String) value;
break;
}
case 3: {
this.outputFormatIndex = (Integer) value;
break;
}
case 4: {
this.shouldBeSaved = (Boolean) value;
break;
}
case 5: {
this.outputFigureIndex = (Integer) value;
break;
}
case 6: {
this.simulationRadius = (Double) value;
break;
}
case 7: {
this.locationProbability = (Double) value;
break;
}
case 8: {
this.minDRSS = (Double) value;
break;
}
case 9: {
this.STDDEV = (Double) value;
break;
}
case 10: {
this.stddevInterferer = (Double) value;
break;
}
case 11: {
this.criterionIndex = (Integer) value;
break;
}
case 12: {
this.sholdShowCalculatedResults = (Boolean) value;
break;
}
default: {
throw new IllegalArgumentException("illegal parameter id");
}
}
} catch (Exception e) {
}
}
public Object getParameterValue(int id) {
switch (id) {
case 1: {
return this.filename;
}
case 2: {
return this.defaultPath;
}
case 3: {
return this.outputFormatIndex;
}
case 4: {
return this.shouldBeSaved;
}
case 5: {
return this.outputFigureIndex;
}
case 6: {
return this.simulationRadius;
}
case 7: {
return this.locationProbability;
}
case 8: {
return this.minDRSS;
}
case 9: {
return this.STDDEV;
}
case 10: {
return this.stddevInterferer;
}
case 11: {
return this.criterionIndex;
}
case 12: {
return this.sholdShowCalculatedResults;
}
default: {
throw new IllegalArgumentException("illegal parameter id");
}
}
}
public String getParameterName(int id) {
switch (id) {
case 1: {
return "file name of the output data";
}
case 2: {
return "default path ";
}
case 3: {
return "output format ";
}
case 4: {
return "save output file ";
}
case 5: {
return "parameter to be drawn";
}
case 6: {
return "simulation radius [km]";
}
case 7: {
return "location probability [%]";
}
case 8: {
return "minimum wanted Signal [dBm]";
}
case 9: {
return "standard deviation of the wanted signal [dB]";
}
case 10: {
return "standard deviation of the interfering signal [dB]";
}
case 11: {
return "protection criterion to be used for limit calculations";
}
case 12: {
return "show calculated results ";
}
default: {
throw new IllegalArgumentException("illegal parameter id");
}
}
}
public boolean check(ScenarioInfo scenario) {
boolean checkPropagationModel = true;
String warning = "<html><br>";
warning += "<br/><br/><strong>Post Processing Plugin: </strong>";
warning += "<br />Please ensure that the values of <br/><strong>C/I, C/(I+N) and I/N</strong><br/>"
+ "are defined as you want, even if there is still a consitency warning."
+ "<br>";
if (shouldBeSaved && !checkFilenameAndPath()) {
filename = "outputData.xml";
defaultPath = "C:";
pathToSave = defaultPath + "\\" + filename;
warning += "<br />Due to the location for the output files has not been defined,<br />the collected data will be saved onto <strong>"
+ pathToSave
+ "</strong> <br /> and the corresponding DTD onto <strong>C:\\result.dtd</strong>";
}
checkPropagationModel = false;
warning += "</html>";
if (checkPropagationModel == false) {
scenario.addConsistencyWarning(warning);
return false;
} else {
return true;
}
}
@Override
public Vector<String> getAllowedParameterValues(int index) {
switch (index) {
case 3:
return this.outputFormat;
case 5:
return this.outputFigure;
case 11:
return this.criterion;
}
return null;
}
@literal
@literal
@param
private void readPosition(ScenarioInfo scenario) {
oneShot = new double[4];
oneShot[0] = currentEvent;
oneShot[1] = scenario.getVictimLink().getReceiver().getPositionX();
oneShot[2] = scenario.getVictimLink().getReceiver().getPositionY();
double radius = scenario.getVictimLink().getReceiver()
.getDistanceTo(rWt);
if (radius > maxDistance)
maxDistance = radius;
}
@literal
@param
private void readDRSS(ScenarioInfo scenario) {
oneShot[3] = scenario.getVictimLink().getDRSSValue();
}
@literal
@literal
@param
@throws
private void readIRSS(ScenarioInfo scenario) {
List<InterferingLink> ilks = scenario.getInterferingLinks();
if (scenario.getNumberOfInterferingLinks() == 1)
multipleLinks = false;
else
multipleLinks = true;
for (InterferingLink link : ilks) {
singleResult = new CollectedData();
singleResult.event = (int) oneShot[0];
singleResult.x = oneShot[1];
singleResult.y = oneShot[2];
singleResult.dRSS = oneShot[3];
singleResult.iRSS = link.getIRSSUnwanted();
singleResult.cOverI = Math.abs(singleResult.dRSS
- singleResult.iRSS);
singleResult.noiseFloor = getNoiseFloor(scenario);
singleResult.isMultipleILK = multipleLinks;
singleResult.ilk = link.getLinkIndex();
try {
singleResult.cOverN = getCoverNplusI(scenario);
} catch (Exception e) {
e.printStackTrace();
}
singleResult.cIverN = getIoverN(scenario);
simulatedResults.add(singleResult);
countVector++;
}
}
private double getNoiseFloor(ScenarioInfo scenario) {
return scenario.getVictimLink().getReceiver().getNoiseFloor().trial();
}
@literal
@param
private void saveResults(ScenarioInfo scenario) {
pathToSave = defaultPath + "\\" + filename;
int fSize = (int) (scenario.getNumberOfInterferingLinks() * 6 * 20
* totalEvents / 1024.0 / 1024.0 + 1);
ProgressBarStoreFile progressstore = new ProgressBarStoreFile(
"Saving TXT file in progress (about " + fSize + " MB)");
progressstore.init();
progressstore.progressBar.setMinimum(0);
progressstore.progressBar.setMaximum(countVector);
try {
BufferedWriter out = new BufferedWriter(new FileWriter(pathToSave));
out.write(header);
out.newLine();
for (int i = 0; i < countVector; i++) {
out.write(simulatedResults.get(i).event + ";");
out.write(simulatedResults.get(i).x + ";");
out.write(simulatedResults.get(i).y + ";");
out.write(simulatedResults.get(i).dRSS + ";");
out.write(simulatedResults.get(i).iRSS + ";");
out.write(simulatedResults.get(i).noiseFloor + ";");
out.write(simulatedResults.get(i).isMultipleILK + ";");
out.write(simulatedResults.get(i).ilk + ";");
out.write(simulatedResults.get(i).cOverN + "");
out.newLine();
progressstore.progressBar.setValue(i + 1);
}
out.flush();
out.close();
progressstore.stop();
} catch (IOException e) {
e.printStackTrace();
}
}
@literal
private void saveResultsXML(ScenarioInfo scenario) {
pathToSave = defaultPath + "\\" + filename;
int fSize = (int) (scenario.getNumberOfInterferingLinks() * 7 * 32
* totalEvents / 1024.0 / 1024.0 + 1);
ProgressBarStoreFile progressstore = new ProgressBarStoreFile(
"Saving XML file in progress (about " + fSize + " MB)");
progressstore.init();
progressstore.progressBar.setMinimum(0);
progressstore.progressBar.setMaximum(countVector);
try {
BufferedWriter out = new BufferedWriter(new FileWriter(pathToSave));
String xmlDeclaration = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>";
String xmlRoot = "result";
String xmlElement = "event";
out.write(xmlDeclaration);
out.newLine();
out.write("<" + xmlRoot + ">");
out.newLine();
for (int i = 0; i < countVector; i++) {
String element = "<" + xmlElement;
element += " eventNr = \"" + simulatedResults.get(i).event;
element += " \" x = \"" + simulatedResults.get(i).x;
element += " \" y = \"" + simulatedResults.get(i).y;
element += " \" dRSS = \"" + simulatedResults.get(i).dRSS;
element += " \" iRSS = \"" + simulatedResults.get(i).iRSS;
element += " \" noiseFloor = \""
+ simulatedResults.get(i).noiseFloor;
element += " \" multiple = \""
+ simulatedResults.get(i).isMultipleILK;
element += " \" ilk = \"" + simulatedResults.get(i).ilk;
element += " \" CoverI = \"" + simulatedResults.get(i).cOverN
+ "\">";
element += "</" + xmlElement + ">";
out.write(element);
out.newLine();
progressstore.progressBar.setValue(i + 1);
}
out.write("</" + xmlRoot + ">");
out.flush();
out.close();
storeDTD();
progressstore.stop();
} catch (IOException e) {
e.printStackTrace();
}
}
@literal
private void storeDTD() {
try {
BufferedWriter out = new BufferedWriter(new FileWriter(defaultPath
+ "\\result.dtd"));
String DTD = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <!ELEMENT result ((event+))> <!ELEMENT event EMPTY>"
+ "<!ATTLIST event dRSS CDATA #REQUIRED eventNr CDATA #REQUIRED "
+ " iRSS CDATA #REQUIRED noiseFloor CDATA #REQUIRED ilk CDATA #REQUIRED x CDATA #REQUIRED y CDATA #REQUIRED CoverI CDATA #REQUIRED multiple CDATA #REQUIRED>";
out.write(DTD);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@literal
<a
* href="http://introcs.cs.princeton.edu/15inout"></a>
<i> </i>
@literal
@param
@throws
private void calculateLocationProbability(ScenarioInfo scenario)
throws Exception {
rLP = new Vector<Double>();
double testDRSS;
double deltaFactor = 0;
double percentage;
double tCoverNplusI = 0;
for (int i = 0; i < simulatedResults.size(); i++) {
testDRSS = simulatedResults.get(i).dRSS;
if (!simulatedResults.firstElement().isMultipleILK) {
if (isUseEBU()) {
double tIRSS = simulatedResults.get(i).iRSS;
tCoverNplusI = 10 * Math
.log10(Math.pow(10, (testDRSS / 10))
/ (Math.pow(10,
(simulatedResults.get(i).iRSS / 10)) + Math.pow(
10,
(simulatedResults.get(i).noiseFloor / 10))));
deltaFactor = tCoverNplusI - rCoverN;
} else {
deltaFactor = testDRSS - minDRSS;
}
} else {
if (isUseEBU()) {
tCoverNplusI = 10 * Math
.log10(Math.pow(10, (testDRSS / 10))
/ (Math.pow(
10,
(getSumOfInterfernce(i, scenario) / 10.)) + Math.pow(
10,
(simulatedResults.get(i).noiseFloor / 10))));
deltaFactor = tCoverNplusI - rCoverN;
} else {
deltaFactor = testDRSS - minDRSS;
}
i += scenario.getNumberOfInterferingLinks() - 1;
}
double rSTDEEVcombined = Math.sqrt(STDDEV * STDDEV
+ stddevInterferer * stddevInterferer);
deltaFactor /= rSTDEEVcombined;
percentage = getPercentageSevenTrials(deltaFactor);
if (isUseEBU()) {
if (tCoverNplusI <= 0)
percentage = 0;
} else {
}
rLP.add(percentage);
}
}
@param
@param
@return
private double getSumOfInterfernce(int i, ScenarioInfo scenario) {
double sumOfInterference = 0;
for (int j = 0; j < scenario.getNumberOfInterferingLinks(); j++) {
sumOfInterference += Math.pow(10,
(simulatedResults.get(i + j).iRSS) / 10);
}
return 10 * Math.log10(sumOfInterference);
}
@return
private boolean isUseEBU() {
return this.useEBU;
}
@return
private double getMaxLP() {
double maxLP = 0;
for (int i = 0; i < rLP.size(); i++) {
if (rLP.get(i) > maxLP) {
maxLP = rLP.get(i);
}
}
return maxLP;
}
@param
@param
@return
private int getPixelStatus(ScenarioInfo scenario, int j) {
int rStatus = 2;
if (simulatedResults.get(j).dRSS < minDRSS) {
rStatus = 0;
} else if (!simulatedResults.get(j).isInterfered) {
rStatus = 1;
} else if (simulatedResults.get(j).isInterfered) {
rStatus = 2;
}
return rStatus;
}
@literal
@param
@throws
private void showSimulatedResults(ScenarioInfo scenario) throws Exception {
if (rLP.size() == 0)
calculateLocationProbability(scenario);
String msg = "Pixels not meeting min dRSS: "
+ getNumberOfPixelsBelowLP() + "\n";
msg += "Pixels with interferer: "
+ getNumberOfPixelsInterfered() + "\n";
msg += "Number of pixels generated: "
+ getNumberOfEventsToBeConsidered()
+ " ("
+ (df.format(getNumberOfEventsToBeConsidered()
/ (maxDistance * maxDistance * Math.PI)))
+ "/sqkm)\n\n";
msg += "Probability of exceeding the limit of "
+ criterion.get(criterionIndex)
+ " = "
+ df.format(getCriterionLimit())
+ " dB due to interference: "
+ (df.format((double) ((getNumberOfPixelsInterfered())
/ (double) (getNumberOfEventsToBeConsidered() - getNumberOfPixelsBelowLP()) * 100.0)))
+ "%\n";
msg += "\nPercentage below minimum wanted Signal level: "
+ (df.format((double) ((getNumberOfPixelsBelowLP())
/ (double) (getNumberOfEventsToBeConsidered()) * 100.0)))
+ "%";
if (isUseEBU()) {
double degradation = ((double) (getNumberOfPixelsNotMeetingLP() - getNumberOfPixelsBelowLP()) / (double) (getNumberOfEventsToBeConsidered() - getNumberOfPixelsBelowLP())) * 100;
msg += "\nDegradation of location probability of "
+ locationProbability + "%: "
+ (df.format(degradation)) + "%";
}
msg += " ";
JFrame frame = new JFrame("Simulation results");
frame.setResizable(true);
frame.setSize(400, 400);
JOptionPane.showMessageDialog(frame, msg,
"Simulation result of post processsing (LP="
+ locationProbability + "%)",
JOptionPane.INFORMATION_MESSAGE);
}
@return
private int getNumberOfPixelsNotMeetingLP() {
int k = 0;
for (int i = 0; i < rLP.size(); i++) {
if (rLP.get(i) < locationProbability) {
k++;
}
}
return k;
}
@param
@return
@throws
private int getNumberOfPixelsEmpty(ScenarioInfo scenario) throws Exception {
int k = 0;
if (!simulatedResults.firstElement().isMultipleILK) {
for (int i = 0; i < simulatedResults.size(); i++) {
if (simulatedResults.get(i).dRSS <= minDRSS) {
k++;
}
}
} else {
for (int i = 0; i < simulatedResults.size(); i++) {
if (simulatedResults.get(i).dRSS <= minDRSS) {
k++;
i += scenario.getNumberOfInterferingLinks() - 1;
}
}
}
return k;
}
@param
@return
private int getNumberOfPixelsInterfered(ScenarioInfo scenario) {
int k = 0;
for (int i = 0; i < simulatedResults.size(); i++) {
if (!simulatedResults.firstElement().isMultipleILK) {
if (getLimitExceeded(i)) {
k++;
}
} else {
if (getLimitExceededMultiple(i, scenario)) {
k++;
}
i += scenario.getNumberOfInterferingLinks() - 1;
}
}
return k;
}
private boolean getLimitExceededMultiple(int i, ScenarioInfo scenario) {
double sumOfInterference = getSumOfInterfernce(i, scenario);
if (getLimitExceeded(i, sumOfInterference)) {
simulatedResults.get(i).isInterfered = true;
return true;
} else {
simulatedResults.get(i).isInterfered = false;
return false;
}
}
@literal
@param
private void drawCoverIColored(ScenarioInfo scenario) {
scaleFigure();
double highestCoverI = getHighestCoverI();
double lowestCoverI = getLowestCoverI();
double rCoverI = 0;
double range = Math.abs(highestCoverI - lowestCoverI);
for (int i = 0; i < simulatedResults.size(); i++) {
if (!simulatedResults.get(i).isMultipleILK) {
rCoverI = simulatedResults.get(i).cOverI;
} else {
rCoverI = getCoverImultiple(scenario, i);
i += scenario.getNumberOfInterferingLinks() - 1;
}
Color colorAtIndex = getColor(rCoverI - lowestCoverI, range);
StdDraw.setPenColor(colorAtIndex);
StdDraw.filledSquare(simulatedResults.get(i).x,
simulatedResults.get(i).y, 0.05, false);
}
drawScaling(lowestCoverI, highestCoverI, maxDistance, 20, " dB");
StdDraw.setPenColor(StdDraw.BLACK);
StdDraw.text(0, 1.05 * maxDistance, "C/I distribution");
StdDraw.text(0.8 * maxDistance, -0.9 * maxDistance, " max distance "
+ df.format(maxDistance) + " km");
StdDraw.text(0.8 * maxDistance, -0.95 * maxDistance,
(totalEvents - scenario.getNumberOfInterferingLinks())
+ " events");
if (scenario.getNumberOfInterferingLinks() > 1) {
StdDraw.text(0.8 * maxDistance, -1 * maxDistance,
scenario.getNumberOfInterferingLinks()
+ " interfering links");
}
StdDraw.show();
}
@literal
@param
private void drawCoverNplusI_Colored(ScenarioInfo scenario) {
scaleFigure();
double lowestCoverN = getLowestCoverN();
double highestCoverN = getHighestCoverN();
double range = highestCoverN - lowestCoverN;
double testCoverN = 0;
for (int i = 0; i < simulatedResults.size(); i++) {
testCoverN = simulatedResults.get(i).cOverN;
if (simulatedResults.firstElement().isMultipleILK) {
int j = 1;
do {
if (simulatedResults.get(i + j).cOverN < testCoverN) {
testCoverN = simulatedResults.get(i + j).cOverN;
j++;
} else {
j++;
}
} while (j < scenario.getNumberOfInterferingLinks());
i += scenario.getNumberOfInterferingLinks() - 1;
}
Color colorAtIndex = getColor(testCoverN - lowestCoverN, range);
StdDraw.setPenColor(colorAtIndex);
StdDraw.filledSquare(simulatedResults.get(i).x,
simulatedResults.get(i).y, 0.05, false);
}
drawScaling(lowestCoverN, highestCoverN, maxDistance, rCoverN, " dB");
StdDraw.setPenColor(StdDraw.BLACK);
StdDraw.text(0, 1.05 * maxDistance, "C/(N+I) distribution");
StdDraw.text(0.8 * maxDistance, -0.9 * maxDistance, " max distance "
+ df.format(maxDistance) + " km");
StdDraw.text(0.8 * maxDistance, -0.95 * maxDistance,
(totalEvents - scenario.getNumberOfInterferingLinks())
+ " events");
if (scenario.getNumberOfInterferingLinks() > 1) {
StdDraw.text(0.8 * maxDistance, -1 * maxDistance,
scenario.getNumberOfInterferingLinks()
+ " interfering links");
}
StdDraw.show();
}
@literal
@param
private void drawDRSS_Colored(ScenarioInfo scenario) {
scaleFigure();
double lowestDRSSS = getLowestDRSS();
double highestDRSSS = getHighestDRSS();
double range = highestDRSSS - lowestDRSSS;
for (int i = 0; i < simulatedResults.size(); i++) {
Color colorAtIndex = getColor(simulatedResults.get(i).dRSS
- lowestDRSSS, range);
StdDraw.setPenColor(colorAtIndex);
StdDraw.filledSquare(simulatedResults.get(i).x,
simulatedResults.get(i).y, 0.04, false);
}
drawScaling(getLowestDRSS(), getHighestDRSS(), maxDistance, -77.1,
" dBm");
StdDraw.setPenColor(StdDraw.BLACK);
StdDraw.text(0, 1.05 * maxDistance, "dRSS distribution");
StdDraw.text(0.8 * maxDistance, -0.9 * maxDistance, " max distance "
+ df.format(maxDistance) + " km");
StdDraw.text(0.8 * maxDistance, -0.95 * maxDistance,
(totalEvents - scenario.getNumberOfInterferingLinks())
+ " events");
StdDraw.show();
}
@literal
@param
private void drawLocationProbability(ScenarioInfo scenario) {
scaleFigure();
double lowestLPnotZero = getLowestLPnotZero();
double maxLP = getMaxLP();
double range = maxLP - lowestLPnotZero;
int j = -1;
for (int i = 0; i < simulatedResults.size(); i++) {
j++;
double percentage = rLP.get(j);
StdDraw.setPenColor(getColor(percentage - lowestLPnotZero, range));
if (percentage < locationProbability
&& simulatedResults.get(i).iRSS > minDRSS && isUseEBU()) {
StdDraw.setPenColor(StdDraw.WHITE);
}
StdDraw.filledSquare(simulatedResults.get(i).x,
simulatedResults.get(i).y, 0.04, false);
if (simulatedResults.firstElement().isMultipleILK) {
i += scenario.getNumberOfInterferingLinks() - 1;
}
}
drawScaling(lowestLPnotZero, maxLP, maxDistance, locationProbability,
"%");
String assumedModelName = scenario.getVictimLink()
.getPropagationModel().getAssumedModel().name();
if (assumedModelName.equals("NoModelDefined")) {
assumedModelName = "User-defined dRSS";
}
StdDraw.setPenColor(StdDraw.BLACK);
if (!isUseEBU()) {
double resultingLP = (double) (100 - (getNumberOfPixelsBelowLP())
/ (double) (getNumberOfEventsToBeConsidered()) * 100);
StdDraw.text(0, 1.11 * maxDistance,
"dRSS Location Propability distribution - "
+ assumedModelName);
StdDraw.text(0, 1.05 * maxDistance,
"Resulting Coverage Propability " + df.format(resultingLP)
+ "%");
} else {
double degradation = ((double) (getNumberOfPixelsNotMeetingLP() - getNumberOfPixelsBelowLP()) / (double) (getNumberOfEventsToBeConsidered() - getNumberOfPixelsBelowLP())) * 100;
StdDraw.text(
0,
1.11 * maxDistance,
"Location Propability distribution for "
+ (df.format((double) (100 - (getNumberOfPixelsBelowLP())
/ (double) (getNumberOfEventsToBeConsidered())
* 100.0))) + "% coverage - "
+ assumedModelName);
StdDraw.text(
0,
1.05 * maxDistance,
"Location Propability degradation relative to "
+ locationProbability + "% = "
+ df.format(degradation) + "%");
}
StdDraw.text(0.8 * maxDistance, -0.9 * maxDistance, " max distance "
+ df.format(maxDistance) + " km");
StdDraw.text(0.8 * maxDistance, -0.95 * maxDistance,
(totalEvents - scenario.getNumberOfInterferingLinks())
+ " events");
StdDraw.show();
}
@literal
@param
private void drawPixelsAffected(ScenarioInfo scenario) {
scaleFigure();
int pixelStatus = 0;
Color[] colorStatus = new Color[] { notAffected, new Color(0, 255, 0),
StdDraw.RED };
int k = 0;
for (int i = 0; i < simulatedResults.size(); i++) {
if (!simulatedResults.firstElement().isMultipleILK) {
pixelStatus = getPixelStatus(scenario, i);
k = i;
} else {
if (simulatedResults.get(i).isInterfered) {
pixelStatus = 2;
k = i;
i += scenario.getNumberOfInterferingLinks() - 1;
} else {
pixelStatus = 0;
int j = 0;
do {
if (pixelStatus < getPixelStatus(scenario, (i + j))) {
pixelStatus = getPixelStatus(scenario, (i + j));
k = i + j;
j++;
} else {
j++;
}
} while (j < scenario.getNumberOfInterferingLinks());
i += scenario.getNumberOfInterferingLinks() - 1;
}
}
StdDraw.setPenColor(colorStatus[pixelStatus]);
StdDraw.filledSquare(simulatedResults.get(k).x,
simulatedResults.get(k).y, 0.05, false);
}
StdDraw.setPenColor(colorStatus[0]);
StdDraw.text(-0.9 * maxDistance, -1 * maxDistance, "LP below "
+ locationProbability + "%");
StdDraw.setPenColor(colorStatus[1]);
StdDraw.text(-0.9 * maxDistance, -0.95 * maxDistance, "not interfered");
StdDraw.setPenColor(colorStatus[2]);
StdDraw.text(-0.9 * maxDistance, -0.90 * maxDistance, "interfered");
StdDraw.setPenColor(StdDraw.BLACK);
StdDraw.text(0, 1.1 * maxDistance, "Pixel distribution - LP = "
+ locationProbability + "%");
StdDraw.text(0, 1.05 * maxDistance, "Interference criterion: "
+ criterion.get(criterionIndex));
StdDraw.text(0.8 * maxDistance, -0.9 * maxDistance, " max distance "
+ df.format(maxDistance) + " km");
StdDraw.text(0.8 * maxDistance, -0.95 * maxDistance,
(totalEvents - scenario.getNumberOfInterferingLinks())
+ " events");
if (scenario.getNumberOfInterferingLinks() > 1) {
StdDraw.text(0.8 * maxDistance, -1 * maxDistance,
scenario.getNumberOfInterferingLinks()
+ " interfering links");
}
StdDraw.setPenColor(StdDraw.CYAN);
StdDraw.circle(0, 0, simulationRadius);
StdDraw.setPenColor(StdDraw.DARK_GRAY);
StdDraw.circle(0, 0, maxDistance);
StdDraw.show();
}
@param
@param
@param
@param
@param
private void drawScaling(double lowest, double max, double distance,
double reference, String s) {
Color rDot;
double x0 = -0.95 * maxDistance;
double y0 = -1.08 * maxDistance;
double y = 0.025;
double x = 0.2;
for (int i = 0; i < 512; i++) {
rDot = getColor(i, 512);
StdDraw.setPenColor(rDot);
StdDraw.line(x0 + i * y, y0, x0 + i * y, y0 + x, false);
}
StdDraw.setPenColor(new Color(0, 0, 255));
StdDraw.text(1.15 * x0, y0, df.format(lowest) + s);
StdDraw.setPenColor(new Color(0, 255, 0));
StdDraw.text(x0 + 545 * y, y0, df.format(max) + s);
if (reference != 0) {
if (max == lowest) {
if (max < reference)
max = reference;
else
lowest = reference;
}
StdDraw.setPenColor(getColor((reference - lowest), (max - lowest)));
StdDraw.text(x0 + 512 * (reference - lowest) / (max - lowest) * y,
y0 + 2 * x, df.format(reference) + s);
}
StdDraw.setPenColor(StdDraw.CYAN);
StdDraw.circle(0, 0, simulationRadius);
StdDraw.setPenColor(StdDraw.DARK_GRAY);
StdDraw.circle(0, 0, maxDistance);
}
@param
@param
@return
private Color getColor(double value, double range) {
Color rColor = new Color(0, 0, 0);
double i = ((value / range) * 511);
if (value == 0)
i = 0;
if (i > 255) {
return rColor = getColorGreen(i);
}
if (i <= 255) {
if (value < 0) {
rColor = new Color(255, 255, 255);
} else {
rColor = new Color((int) (i), 0, 255 - (int) (i));
}
}
return rColor;
}
@param
@return
private Color getColorGreen(double value) {
Color rColor;
int i = (int) (value - 256);
if (value < 0) {
rColor = new Color(255, 255, 255);
} else {
rColor = new Color(255 - i, i, 0);
}
return rColor;
}
@literal
@param
@return
private Color getColorNotAffected(String color) {
String[] colors = color.split(",");
int red = Integer.parseInt(colors[0]);
int green = Integer.parseInt(colors[1]);
int blue = Integer.parseInt(colors[2]);
return new Color(red, green, blue);
}
@param
@param
@return
private double getCoverImultiple(ScenarioInfo scenario, int i) {
double tCoverI = simulatedResults.get(i).cOverI;
int j = 1;
do {
if (simulatedResults.get(i + j).cOverI < tCoverI) {
tCoverI = simulatedResults.get(i + j).cOverI;
j++;
} else {
j++;
}
} while (j < scenario.getNumberOfInterferingLinks());
return tCoverI;
}
@param
@return
@throws
private double getCoverNplusI(ScenarioInfo scenario) throws Exception {
double CoverN = 0;
CoverN = 10 * Math.log10(Math.pow(10, ((singleResult.dRSS) / 10))
/ ((Math.pow(10, (singleResult.iRSS / 10)) + Math.pow(10,
(singleResult.noiseFloor / 10)))));
return CoverN;
}
@return
private double getCriterionLimit() {
switch (criterionIndex) {
case 0:
return rCoverI;
case 1:
return rCoverN;
case 2:
return rIoverN;
default:
return (rCoverN);
}
}
@return
private double getHighestCoverI() {
double highest = -100;
for (int i = 0; i < simulatedResults.size(); i++) {
if (simulatedResults.get(i).cOverI > highest) {
highest = simulatedResults.get(i).cOverI;
}
}
return highest;
}
@return
private double getHighestCoverN() {
double highest = -100;
for (int i = 0; i < simulatedResults.size(); i++) {
if (simulatedResults.get(i).cOverN > highest) {
highest = simulatedResults.get(i).cOverN;
}
}
return highest;
}
@return
private double getHighestDRSS() {
double highest = -100;
for (int i = 0; i < simulatedResults.size(); i++) {
if (simulatedResults.get(i).dRSS > highest) {
highest = simulatedResults.get(i).dRSS;
}
}
return highest;
}
@param
@return
private double getIoverN(ScenarioInfo scenario) {
double rIoverN = 10 * Math.log10(((Math.pow(10,
(singleResult.iRSS / 10)) + Math.pow(10,
(singleResult.noiseFloor / 10)))));
rIoverN = 10 * Math.log10(((Math.pow(10, (minDRSS / 10)) + Math.pow(10,
(singleResult.noiseFloor / 10)))));
return rIoverN;
}
@param
@return
private boolean getLimitExceeded(int i) {
boolean isInterfered = false;
switch (criterionIndex) {
case 0: {
if (simulatedResults.get(i).dRSS < (simulatedResults.get(i).iRSS + rCoverI)
&& simulatedResults.get(i).dRSS > minDRSS) {
simulatedResults.get(i).isInterfered = true;
isInterfered = true;
}
break;
}
case 1: {
if (simulatedResults.get(i).dRSS < (simulatedResults.get(i).iRSS + rCoverN)
&& simulatedResults.get(i).dRSS > minDRSS) {
simulatedResults.get(i).isInterfered = true;
isInterfered = true;
}
break;
}
case 2: {
if (simulatedResults.get(i).iRSS >= (simulatedResults.get(i).noiseFloor + rIoverN)
&& simulatedResults.get(i).dRSS > minDRSS) {
simulatedResults.get(i).isInterfered = true;
isInterfered = true;
}
break;
}
default:
isInterfered = false;
}
return isInterfered;
}
private boolean getLimitExceeded(int i, double sum) {
boolean isInterfered = false;
switch (criterionIndex) {
case 0: {
if (simulatedResults.get(i).dRSS < (sum + rCoverI)
&& simulatedResults.get(i).dRSS > minDRSS) {
simulatedResults.get(i).isInterfered = true;
isInterfered = true;
}
break;
}
case 1: {
double includeNoise = 10 * Math.log10(Math.pow(10, (sum / 10))
+ Math.pow(10,
(simulatedResults.get(i).noiseFloor / 10)));
if (simulatedResults.get(i).dRSS < (includeNoise + rCoverN)
&& simulatedResults.get(i).dRSS > minDRSS) {
simulatedResults.get(i).isInterfered = true;
isInterfered = true;
}
break;
}
case 2: {
if (sum >= (simulatedResults.get(i).noiseFloor + rIoverN)
&& simulatedResults.get(i).dRSS > minDRSS) {
simulatedResults.get(i).isInterfered = true;
isInterfered = true;
}
break;
}
default:
isInterfered = false;
}
return isInterfered;
}
@literal
@param
@return
private double getLocationProbabilityFactor(double x) throws Exception {
double Q, t, xi;
double c0, c1, c2, d1, d2, d3;
x /= 100;
try {
if (x > 0.5) {
x = 1 - x;
}
c0 = 2.515517;
c1 = 0.802853;
c2 = 0.010328;
d1 = 1.432788;
d2 = 0.189269;
d3 = 0.001308;
t = Math.sqrt((-2 * Math.log(x)));
xi = (((c2 * t + c1) * t) + c0)
/ (((d3 * t + d2) * t + d1) * t + 1);
if (x <= 0.5) {
Q = t - xi;
} else {
Q = -(t - xi);
}
return Q;
} catch (Exception e) {
throw new Exception(e.getMessage());
}
}
@return
private double getLowestCoverI() {
double lowest = 1000;
for (int i = 0; i < simulatedResults.size(); i++) {
if (simulatedResults.get(i).cOverI < lowest) {
lowest = simulatedResults.get(i).cOverI;
}
}
return lowest;
}
@return
private double getLowestCoverN() {
double lowest = 100;
for (int i = 0; i < simulatedResults.size(); i++) {
if (simulatedResults.get(i).cOverN < lowest) {
lowest = simulatedResults.get(i).cOverN;
}
}
return lowest;
}
@return
private double getLowestDRSS() {
double lowest = 100;
for (int i = 0; i < simulatedResults.size(); i++) {
if (simulatedResults.get(i).dRSS < lowest) {
lowest = simulatedResults.get(i).dRSS;
}
}
return lowest;
}
@return
private double getLowestLPnotZero() {
double[] tLP = new double[rLP.size()];
for (int i = 0; i < tLP.length; i++) {
tLP[i] = rLP.get(i);
}
Arrays.sort(tLP);
int i = -1;
do {
i++;
} while (tLP[i] <= 0);
double lowest = tLP[i];
return lowest;
}
@literal
private void scaleFigure() {
StdDraw.setCanvasSize(900, 900);
StdDraw.setXscale((-1.2) * maxDistance, 1.2 * maxDistance);
StdDraw.setYscale((-1.2) * maxDistance, 1.2 * maxDistance);
}
@literal
@param
@return
private double getPercentageSevenTrials(double deltaFactor2) {
double rPmid = 0;
double rProbabilityFactor = 0;
double rPmin = 0;
double rPmax = 99.999;
double erfcMax = 5;
double erfcMin = 0;
try {
erfcMax = getLocationProbabilityFactor(rPmax);
} catch (Exception e1) {
e1.printStackTrace();
}
erfcMin = -erfcMax;
try {
rProbabilityFactor = getLocationProbabilityFactor(locationProbability);
} catch (Exception e1) {
e1.printStackTrace();
}
double delta = deltaFactor2 + rProbabilityFactor;
if (delta > erfcMax) {
return rPmax;
} else if (delta < erfcMin) {
return (100 - rPmax);
} else {
double erfc = 0;
while (true) {
rPmid = (rPmax - rPmin) / 2 + rPmin;
try {
erfc = getLocationProbabilityFactor(rPmid);
} catch (Exception e) {
e.printStackTrace();
}
if (delta < 0)
erfc *= -1;
if (erfc < erfcMin)
erfc = erfcMin;
if (Math.abs(erfc - delta) < 0.001) {
break;
} else {
if (erfc < delta) {
rPmin = rPmid;
} else
rPmax = rPmid;
}
}
return rPmid;
}
}
@return
private int getNumberOfPixelsBelowLP() {
return numberOfPixelsBelowLP;
}
@param
@param
private void setNumberOfPixelsBelowLP(ScenarioInfo scenario) {
try {
this.numberOfPixelsBelowLP = getNumberOfPixelsEmpty(scenario);
} catch (Exception e) {
e.printStackTrace();
}
}
@return
private int getNumberOfPixelsInterfered() {
return numberOfPixelsInterfered;
}
@param
@param
private void setNumberOfPixelsInterfered(ScenarioInfo scenario) {
this.numberOfPixelsInterfered = getNumberOfPixelsInterfered(scenario);
}
@return
private int getNumberOfEventsToBeConsidered() {
return numberOfEventsToBeConsidered;
}
@param
private void setNumberOfEventsToBeConsidered(ScenarioInfo scenario) {
this.numberOfEventsToBeConsidered = scenario.getTotalNumberOfEvents()
- scenario.getNumberOfInterferingLinks();
}
}
class CollectedData {
int event;
double x;
double y;
double dRSS;
double iRSS;
int ilk;
double cOverN;
double cOverI;
double cIverN;
double noiseFloor;
boolean isMultipleILK;
boolean isInterfered;
}
class ProgressBarStoreFile {
JProgressBar progressBar;
JFrame frame;
public ProgressBarStoreFile(String label) {
this.frame = new JFrame(label);
this.progressBar = new JProgressBar(0, 100);
}
public void init() {
int width = 400;
int height = 50;
progressBar.setStringPainted(true);
progressBar.setForeground(new Color(200, 200, 50));
frame.setSize(width, height);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.getContentPane().add(progressBar);
frame.setVisible(true);
}
public void stop() {
frame.dispose();
frame.setVisible(false);
}
}